周波数カウンターの精度アップ(1)
高精度の周波数カウンターを PICを用いて作成するのはかなり難しい。それは、マイコンでは一つの動作点で複数の操作を同時にすることができないため、ゲート操作と
データ採取(キャプチャー)の時間差がどうしても出てしまうからである。
周波数カウンターの基本方式は、
T. (計測時間 + 処理時間) の周期を、正確な周波数信号を用いて、プログラム内部で数値を設定してゲートタイムを決める方法
U. 初めから一定の周期の信号が与えられている場合で、処理時間を極小にするか、あるいは、同じ処理ステップ数によって同期させて行う方法
、に分けられる。(* 信号の周期を測定してから換算する レシプロカル方式でも同様)
T は、よく行われる方法で、計測時間のほかに処理時間を設け、タイマーや コンペアの上位・下位ビットの調整可能な設定によって、216 = 65536 あるいはそれ以上の分解能で (1秒 + 処理時間)を決定する。この 入力信号をゲートで一時止めて処理する方法によって、動作クロックが2.5MHz程度でも、5〜6桁(ゲート0.1S)あるいは 6〜7桁(1S)までの精度のカウンターを簡単に作ることができる。
さらに精度を上げるためには、温度補償された高精度の水晶を用いるか、水晶の片側につけたトリマや可変容量ダイオードなどによってアナログ微調整をする。
一方、Uの方法は、データのキャプチャーのタイミングを、すべてのビットで完全に同時に行われなければならない。(特に高周波の場合)1ステップでもずれると、表示に段差やちらつきが出てしまう。 たとえば 外部水晶発振器や GPS信号(1秒)などの 固定された周期のゲート信号が与えられている場合、処理時間の誤差を何らかの方法で補償する(マイコン内で補正計算)か、2倍の時間をかけて1つおきに測定する、などの工夫が必要となる。
1. 2 PIC方式 周波数カウンターの試作 (PIC18F14K50 + PIC18F14K50(発振器)):
そこで まず、上記の T.の方式で試作し、高精度化するための問題点を抽出することにした。ここでは、2つのPICを用いて互いにINT入力で制御し合う方式とし、これによって スイッチの設定等で、プログラムの処理時間が多少増減してもかまわないようにすることができる。また、1秒以上の遅いパルスを送るので、マイコン内でタイマ1等を用いて時間を創生する必要はなく、割込みでぶつかる頻度も少なくなる。
マイコン側の基本構成は、27.サイクルカウンター応用回路 2.の8桁周波数カウンター と同じで、簡単のためゲートタイムは 1秒に固定した。 発振器には マイコン(PIC18F14K50、動作速度12MHz)を用い、約1秒のパルスで 互いにパルスを送って、データのキャプチャーと ゲート時間開始のタイミングを制御するようにした。
・ 通信方法は、@ 発振器側のタイマ1のオーバーフローによる 正確な約1秒(1秒
+ 処理時間)の後、RB7からパルスを送り、マイコン側のINT1で受け、まず
T0CKIをOFFにして信号を止め、それから データの処理を行う。 A 処理が終わったら、マイコンからパルスを送り、発振器のINT0で受け、タイマ1によるゲート時間採取を再開する。
マイコン側では、タイマ0に 8ビットモードを用いたので、割込み直後の T0CONbits.TIMER0ON=0 によってゲートを閉じ、=1 によって再開した。
* PIC18Fのタイマ0の 16ビットモードでは、割り込み中、および、割り込み以外の両方で T0CONが制御不能になり、TMR0L の読み出しの時点で自動的にタイマ0がOFFになり(同時にTMR0Hも読み込む というメリットがある。(書き込みのときは逆にTMR0Hが先) この点が、PIC12、16シリーズから、PIC18シリーズへの改良点になっている。)、割込み終了と同時にタイマ0が再スタートする。
したがって、スイッチによる T0CONを用いた プリスケーラーの切り替え(1/8、1/1等)もできないので注意。
・ マイコンへの信号入力は、T0CKI入力では 約6MHz以上でカウント不能になるので、タイマ0の 1/8 プリスケーラーを用いて、データ処理で8倍した。したがって、表示は8の倍数となる。 このプリスケーラーの方は約40MHzまでカウントすることができる。(Highモード: 1/8、 Lowモード: 1/1)
** この 8の倍数という粗さを改善するため、タイマ0プリスケーラーの中味(0〜7の数値)を”掃き出し法”(
・・・ T0CKIに隣接したRA5を出力用に切り替え(470Ωの抵抗を共通して入れている)、割込み内部で発生させた
256×8個までのパルスをT0CKIに入れて タイマ0をオーバーフローさせ、2048との差の数値として採取する)によって読み取ることを検討したが、(特にプリスケーラーを入れた状態で)異常値が発生するのでやめることにした。(→ (参考)
プログラムの割り込み部分)
・ 発振器の水晶(49USタイプの普及品、12.000MHz)は、上記の回路で 片側に 7pFのトリマ(シールドタイプ)を並列に入れたところ、測定数値(33.000000MHz)の下3桁が
±190 ほど可変できて、調整はかなりクリチカルだった。 また、この水晶は温度変化に敏感で、ハンダゴテで2〜3秒暖めると 下3桁が約300もはね上がったので、7桁以上の高精度化には
これが最もポイントとなる。
● ソース(14K50): ● ソース(14K50、発振器):
2. TTLプリスケーラ付き周波数カウンター (PIC18F2550 + PIC18F14K50(発振器)):
0 から 約80MHzまで 分周無し(1/1)で ストレートに測定するために、入力のT0CKIには、多少かさばるが、TTL IC(74AC)による D−FF を用いて2進カウンタを作り、各数値を抽出可能な 1/16プリスケーラーを前段に設けることにした。(74AC74
×2で 2進カウント×4、74AC175 ×1で ラッチ×4) ラッチ、クリヤ共
負パルス、得られるビット信号は負論理なので注意。(/Qでなく Qをとれば正論理になる)
タイマ0を16ビットモードに設定したので、演算式(unsigned long
int 変数・10桁、0 〜 4294967295)は、
FFF = (AA*65536 + TH*256 + TL)*16
+ dd*8 + cc*4 + bb*2 + aa;
となる。
この場合、入力信号の開閉を行うためのゲートが 74AC00 のNAND1段では行き過ぎによる表示のジャンプが抑えられなかったので、タイマ0が16ビットモードであるにもかかわらず、結局、ゲートを2段階設け、@ TTL IC プリスケーラーの ゲートのON、OFF動作と、A PIC内のT0CKI のON、OFF動作(T0CON)を、それぞれできるだけ同時に行うことができるように、発振器とマイコンの両方からタイミングを調整した。タイミング調整が 1 〜 2命令分ずれると、8桁目が1つふらつく。(下図 プログラム(左上) ↓)
その結果、TTLプリスケーラーと タイマ0の タイミングのずれに起因する
数値のジャンプ・ふらつきが、8桁目まで全く無くなった。 (・・・・ 実は、2PIC化した意義はここにある)
また、16ビットモード(65536まで数える)なので、タイマ0のオーバーフローの回数が少なく、割り込み同士がぶつかる頻度もほとんど皆無になった。
プリアンプには、2SK241GR の代わりに 2SK439E (2SK241より多少
f 特が良い)をそのまま差し替えて用いた。 74ACは 120MHzくらいまで使えるはずなので、プリアンプの性能が測定周波数の上限を決めると思われる。
プリスケーラーには、MB504(10MHz 〜520MHz、1/32分周、電源5V)を用い、入力インピーダンスを50Ωとし、発振防止のため入力を10kΩでアースに落とした。数値はマイコンで32倍し、表示を一桁切り捨てた。
周波数の表示を長期的に変動させ、その変動率が大きい原因となっている水晶振動子は、とりあえず、手持ちの普及品を使用した。 水晶(12.000MHz、49US型)は、サーモスタットIC(TC622EPA)付きのヒーター(2W・33Ωセメント抵抗×3本直列、電源9Vで90mA・0.8W)を組み立てて取り付け、エポキシで固定した。また、温度測定用IC(LM35DZ・・・100mV台
= 10℃台の温度に換算、±0.5℃)も同時に挿入して、温度測定しながら周波数の変化を調べることにした。
また、トリマの代わりに、可変容量ダイオード(1SV101: 3V 30pF、 4V 27.2pF、 5V 24.3pF、(9V 13pF))を入れて、多回転VR(10kΩ)によって
印加電圧を微調整できるようにした。この回路では、33MHzで7、8桁目を±20くらい調整できる。
● ソース(2550): ● ソース(14K50、発振器):
高精度の基準発振器が無いので、いくつかの5〜7桁台の クリスタルオシレータで、しばらく電源を入れ安定したあたりで測定してみた結果は、次のとおりである。
(1) TTLプリスケーラとのマッチングができているかの確認として、AGからの
19Hz〜の低周波を、周波数をゆっくり変化させながら測定した結果は、特に、T0CKIへの切り替わりの
32Hz、48Hz、64Hz、・・・ などでも問題なくなめらかに切り替わった。(負論理なので
T0CKI には/Qで入力する)
(2) クリスタルオシレータによる測定結果( + 上記1.の14K50・2INT・TMR0
8ビット + TTL IC のみで作成した5桁周波数カウンタとの比較):
水晶発振器が充分安定して ほとんど変動していない短時間で測定した結果は、すべてオシレーターの公称値の範囲内(実質5、または、6桁)には楽に入っていた。これは一般的な水晶の精度(10-6)と同等。 (cf. TTL IC5桁カウンタは、ゲートで止めず、シンプルな連続計測で
ラッチとクリヤとの時間間隔がかなり開いているので、発振器でその分をゲートタイムに足している。2550との偏差が出ているのは
合わせた基準オシレータが異なるため。変化の割合( Δ/ f )は同じ) 数え落としや
発振による周波数の増加等は 特に無いと思われる。
クリスタルオシレータ (公称値・メーカー) |
2550・TTLプリスケーラ TMR0 16ビットモード |
2550・TTLプリスケーラ TMR0 16ビットモード (1/32プリスケーラ) |
14K50/ TMR0 8ビットモード (1/8 High レンジ) |
14K50/ TMR0 8ビットモード (1/1 Low レンジ) |
14K50/ TMR0 8ビットモード (1/100プリスケーラ) |
cf. TTL IC 5桁カウンタ |
2550との 偏差 (下3桁) |
|||
4.9152(MHz)、EPSON | 4.915191 | − | 4.915192 | 4915.193(kHz) | − | 4.91514 | Δ=049 | |||
33.0000、 EPSON | 33.000000 | 33.00003 | 33.000008 | − | − | 32.99965 | Δ=350 | |||
125.000(0)、EPSON | − | 125.00025 | − | − | 125.0003 | − | − | |||
4.000、 ? | 3.999975 | − | 3.999984 | 3999.985 | − | 3.99994 | Δ=045 | |||
14.318(18)、京セラ? | 14.318304 | − | 14.318344 | − | − | 14.31817 | Δ=144 |
* 太字は、調整して合わせた数値
(3) 水晶発振周波数の温度変動はひどいもので、電源を入れると 33MHzで下3桁が200くらい減少して、30分くらいで落ち着くというものだった。
サーモスタットのVRを少しずつ回して 挿入した温度計測ICによって測定したところ、温度が上がるとほぼ直線的に周波数が下がる結果であり、30〜50℃には曲線の平坦な部分は無かった。(下
グラフ) (これは、1.で水晶をハンダゴデで加熱した傾向とは逆になった?)
また、温度が安定して恒温状態(約40℃)になったときは、サーモスタットIC(公称±1℃)によるON/OFFの脈動(15秒〜1分程度の間隔)に少し遅れて、測定温度は ±0.5℃程度に収まるが、周波数は(33MHzの時の下1桁 = 8桁目で) ±3程度脈動した。
因みに、信号源として用いたクリスタルオシレータは、外気温20〜27℃で
7、8桁目が 20くらい長期変動する。
水晶振動子は、その切り出し方によって発振周波数−温度特性が敏感に左右される。たとえば、切り出しモードが”厚みすべり振動モード:ATカット・基本波(通常2〜30MHz)”で は角度の誤差を数秒以内におさめる必要があり、角度が外れるほど急峻な曲線になるので、高精度水晶ほど高い加工技術が要求される。
発振周波数の温度特性は、右上図のような平坦な”安定領域”を持つはずであるが、今回使用したCX3225SB(公称12.000000MHz、京セラ)は、10〜20℃程度の温度で8桁の精度を発揮するらしく、目標とした40℃前後では前回の49US普及型の半分程度の勾配(逆勾配)があり、それほど効果は無かった。(市販されている
恒温槽水晶発振子は、この安定領域が40〜50℃あたりにシフトし、必ずしもサーモスタットを必要としない構造になっている。因みに、腕時計用の水晶は
体温あたりがこの平坦部になるように設計されている。)
このチップ型高精度水晶(3.3mm×2mm)は、プリント基板に付けて最短距離で配線するよう推奨されているが、恒温仕様にするために、振動子に足を付け(φ0.32スズメッキ線)、同様にサーモスタットIC制御のセメント抵抗(2W33Ω×3、9V)の間に挿入して作成した。
負荷容量 CL = 8pF なので、アースに落とすコンデンサーは10pF程度とした。
アナログ調整も同様に1SV101で行い、10kΩ多回転VRで±20(at.33MHz)調整することができた。
しかし、結果は期待したほど良くなく、
(1) 電源を入れて周波数が 校正済の 8桁の値に安定するまでの時間は、約30分
(2) 恒温槽のサーモスタットON/OFFによる温度変動(測定部)が 40.6〜 41.0℃で、 Δf = ±1.5 〜 2(Hz)(33MHz測定)変動(周期約2分)
したがって、恒温仕様にしても 7桁半程度しか精度が出ていないことになる。
先の、49US普及品の方は 80℃あたりで平坦部になるが、恒温槽がチンチンに熱くなって都合が悪い。
とりあえず、8桁目はその平均値で読み取ることにした。
結局のところ、水晶振動子の精度・安定度が問題で、いくら 7桁半までのタイマ設定や 8桁以上のアナログ微調整をいれても、8桁の精度の周波数カウンターは実現しないということになる。
通信・計測分野における水晶発振子の精度と安定度の向上は 真空管時代(昭和20年代)からの悲願で、水晶の加工精度や恒温槽(バイメタル式など)などさまざまな改良が加えられてきた歴史がある。
8桁以上の精度を出すには、”適合した水晶”という 部品しだいということになる。 部品を入手する機会があれば、改良していくつもりである。